#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：dataframe数据处理.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/12/29 13:36 
"""

import pandas as pd


class DataFrameProcessor:
	"""
	用于封装DataFrame数据处理功能的模块。
	"""

	def __init__(self):
		pass

	def read_data(self, file_path: str, sep: str = ',', encoding: str = 'utf-8'):
		"""
		从文件中读取数据并创建DataFrame。

		:param file_path: 文件路径。
		:param sep: 文件分隔符，默认为逗号。
		:param encoding: 文件编码，默认为utf-8。
		:return: DataFrame对象。
		"""
		try:
			df = pd.read_csv(file_path, sep=sep, encoding=encoding)
			print("数据读取成功。")
			return df
		except Exception as e:
			print(f"读取数据时出错：{e}")
			return None

	def store_data(self, df: pd.DataFrame, file_path: str, sep: str = ',', encoding: str = 'utf-8',
				   index: bool = False):
		"""
		将DataFrame存储到文件。

		:param df: DataFrame对象。
		:param file_path: 文件路径。
		:param sep: 文件分隔符，默认为逗号。
		:param encoding: 文件编码，默认为utf-8。
		:param index: 是否存储索引，默认为False。
		"""
		try:
			df.to_csv(file_path, sep=sep, encoding=encoding, index=index)
			print("数据存储成功。")
		except Exception as e:
			print(f"存储数据时出错：{e}")

	def set_column_names(self, df: pd.DataFrame, column_names: list):
		"""
		设置DataFrame的列名。

		:param df: DataFrame对象。
		:param column_names: 列名列表。
		"""
		try:
			df.columns = column_names
			print("列名设置成功。")
		except Exception as e:
			print(f"设置列名时出错：{e}")

	def change_column_type(self, df: pd.DataFrame, column_name: str, data_type: type):
		"""
		修改DataFrame某一列的数据类型。

		:param df: DataFrame对象。
		:param column_name: 列名。
		:param data_type: 要修改的数据类型。
		"""
		try:
			df[column_name] = df[column_name].astype(data_type)
			print(f"列 '{column_name}' 数据类型修改成功。")
		except Exception as e:
			print(f"修改列数据类型时出错：{e}")

	def handle_missing_values(self, df: pd.DataFrame, column_name: str, fill_value=None):
		"""
		处理DataFrame中某些列的空值。

		:param df: DataFrame对象。
		:param column_name: 列名。
		:param fill_value: 填充值，默认为None，表示删除空值行。
		"""
		try:
			if fill_value is not None:
				df[column_name].fillna(fill_value, inplace=True)
				print(f"列 '{column_name}' 的空值已填充。")
			else:
				df.dropna(subset=[column_name], inplace=True)
				print(f"列 '{column_name}' 的空值行已删除。")
		except Exception as e:
			print(f"处理空值时出错：{e}")


if __name__ == '__main__':
	# 创建DataFrameProcessor实例
	processor = DataFrameProcessor()

	# 读取数据
	df = processor.read_data('data.csv')

	# 设置列名
	processor.set_column_names(df, ['name', 'age', 'city'])

	# 修改列类型
	processor.change_column_type(df, 'age', int)

	# 处理空值
	processor.handle_missing_values(df, 'age', fill_value=0)  # 填充空值
	# processor.handle_missing_values(df, 'city')  # 删除空值行

	# 存储数据
	processor.store_data(df, 'processed_data.csv')
